iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

你知道Go是什麼嗎?系列 第 20

Day20 - MySQL - Golang

  • 分享至 

  • xImage
  •  

今天就來介紹SQL,預計SQL介紹一篇,NoSQL介紹一篇,今天的話就以大家比較常聽見的MySQL當例子。

MySQL

一款關聯式資料庫管理系統(RDBMS),多應用在中小型的網站中,配合如PHPASPASP.NET等後端程式語言,儲存數據,若網站擁有後端管理程式系統(網站後台),多須配合資料庫功能。

RDBMS (Relational Database Menagement System)
關聯式資料庫管理系統

  • 由各種資料表(Table)組成
  • 資料各自存在資料表中,再由特定欄位將多資料表串起來
  • 透過SQL語言管理資料庫,用來新增、查詢、更新和刪除資料。

使用Golang操作MySQL

Go有提供SQL的抽象介面database/sql,而網路上也有前輩提供了go-sql-driver/mysql套件,提供了SQL的抽象介面來去實作。

Download與Import

$ go get -u github.com/go-sql-driver/mysql

import(
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

連線

在測試時有發生以下問題,查一下後發現是因為MySQL建立時沒設root密碼導致,使用指令把密碼設定好就好。
2022/10/05 19:01:57 Error 1045: Access denied for user 'root'@'localhost' (using password: NO)

package main

import (
	"database/sql"
	"fmt"
	"log"
    _ "github.com/go-sql-driver/mysql"
)

const (
	UserName     string = "test_root"
	Password     string = "password"
	Addr         string = "127.0.0.1"
	Port         int    = 3306
	Database     string = "test"
	MaxLifetime  int    = 10
	MaxOpenConns int    = 10
	MaxIdleConns int    = 10
)
func main() {
	conn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", UserName, Password, Addr, Port, Database)
	db, err := sql.Open("mysql", conn)
	if err != nil {
		fmt.Println("connection to mysql failed:", err)
		return
	}
}

由於完整的連線格式如下,因此用常數都先設好再Sprintf成字串會比較方便。
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

  • SetConnMaxLifetime:設置了連接可重用的最大時間
  • SetMaxOpenConns:設定最大連線數
  • SetMaxIdleConns:設定閒置連線量

CRUD

進入CRUD前先看一下SQL中的之前建立的一張表,pokemon

查詢以外,都是將SQL語法寫好並使用db.Exec()執行,有參數要填入的地方使用?取代,並補在後面。


INSERT

接著上面的繼續寫

result, err := db.Exec(
    "INSERT INTO pokemon (pokemonID, pokemonName, description) VALUES (?, ?, ?)",
    19,
    "烏龜獸",
    "每天去吃吃到飽,是一隻九十公斤的胖子",
)

烏龜獸成功被建立了。

UPDATE

result, err := db.Exec(
		"UPDATE pokemon SET pokemonID = ? WHERE pokemonName = ?",
		18,
		"烏龜獸",
	)


烏龜獸19修正成18

DELETE

result, err := db.Exec(
    "DELETE from pokemon WHERE pokemonID = ?",
    18,
)

刪除就看不到了,沒截圖ˊˇˋ

QUERY

  • db.QueryRow: 查詢單筆資料
  • db.Query: 查詢多筆資料

查詢得到row之後要用變數存放查詢到的值,下例是建立idnamedescription存放並直接print出來。

row, err := db.Query("SELECT * FROM pokemon")
defer row.Close() // 最後釋放資源
if err != nil {
	log.Fatal(err)
	return
}
for row.Next() {
	var id string
	var name string
	var description string
	if err := row.Scan(&id, &name, &description); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("id:%s name:%s description:%s\n", id, name, description)
}

output:

id:1 name:皮卡丘 description:棲息在森林中的寶可夢。由於它臉頰上的袋子中儲存了電能,觸摸了之後會覺得麻麻的。
id:2 name:正電拍拍 description:會製造火花拉拉球來給夥伴加油。能從電線桿上吸取電力。
.
.
.


Go使用MySQL的差不多就介紹到這,其他不屬於Go的部分,屬於SQL那邊的就不多講了,今天就介紹到這吧,明天再來看看Go操作NoSQL的方法。

參考資料

Golang 如何使用 mysql
https://ithelp.ithome.com.tw/articles/10207409

[DAY22]Golang玩MySQL
https://ithelp.ithome.com.tw/articles/10243865

使用 MySQL 資料庫
https://willh.gitbook.io/build-web-application-with-golang-zhtw/05.0/05.2


上一篇
Day19 - Defer、Panic、Recover - Golang
下一篇
Day21 - NoSQL - Golang
系列文
你知道Go是什麼嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言